package qc.module.ehs.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.module.ehs.dto.taskgroup.TaskGroupAddDto;
import qc.module.ehs.dto.taskgroup.TaskGroupInfoDto;
import qc.module.ehs.dto.taskgroup.TaskGroupUpdateDto;
import qc.module.ehs.service.EhsTaskGroupService;

import java.util.List;

/**
 * EHS 安全任务分组Controller
 *
 * @author QuCheng Tech
 * @since 2024/11/13
 */
@RestController
@RequestMapping("/taskgroup")
public class TaskGroupController {
    
    @Autowired
    private EhsTaskGroupService service;

    /**
     * 获取指定任务的所有分组信息
     * 
     * @param id 任务ID
     * @return List<TaskGroupInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/14
     */
    @GetMapping("/task")
    public List<TaskGroupInfoDto> getTaskGroupsByParam(@RequestParam String id){
        return service.getTaskGroups(id);
    }

    /**
     * 获取指定任务的所有分组信息
     *
     * @param id 任务ID
     * @return List<TaskGroupInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/14
     */
    @GetMapping("/task/{id}")
    public List<TaskGroupInfoDto> getTaskGroupsByPath(@PathVariable String id){
        return service.getTaskGroups(id);
    }

    /**
     * 获取指定任务分组信息
     * 
     * @param id 任务分组ID
     * @return TaskGroupInfoDto
     * @author QuCheng Tech
     * @since 2024/11/14
     */
    @GetMapping("/group")
    public TaskGroupInfoDto getGroupByParam(@RequestParam String id){
        return service.getGroup(id);
    }

    /**
     * 获取指定任务分组信息
     *
     * @param id 任务分组ID
     * @return TaskGroupInfoDto
     * @author QuCheng Tech
     * @since 2024/11/14
     */
    @GetMapping("/group/{id}")
    public TaskGroupInfoDto getGroupByPath(@PathVariable String id){
        return service.getGroup(id);
    }

    /**
     * 新增任务分组
     * 
     * 不管任务是否派单均能进行该操作，要求任务的执行完成为false并且终止/取消为false；
     * 该操作不影响已执行的分组和任务项；新增时如有指定分组对象（单元、设备设施、危险源）需要判断是否已有，已有对象不重复添加；如未指定分组对象，不需要进行重复判断；
     * 
     * @param addDto 新增对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/14
     */
    @RequestMapping(value = "/add",method = {RequestMethod.POST})
    public String add(@RequestBody TaskGroupAddDto addDto){
        return service.add(addDto);
    }

    /**
     * 修改任务分组
     * 
     * 不管任务是否派单均能进行该操作，要求任务的执行完成为false并且终止/取消为false；同时要求分组的执行完成为false并且终止/取消为false；
     * 该操作不影响已执行的分组和任务项；
     * 修改时不对分组中的关联对象信息进行修改，如果指定的关联对象错误需要进行删除或对指定分组进行终止/取消操作；
     * 新增时如有指定分组对象（单元、设备设施、危险源）需要判断是否已有，已有对象不重复添加；如未指定分组对象，不需要进行重复判断；
     * 
     * @param updateDto 修改对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @RequestMapping(value = "/update",method = {RequestMethod.POST,RequestMethod.PUT})
    public String update(@RequestBody TaskGroupUpdateDto updateDto){
        return service.update(updateDto);
    }

    /**
     * 删除任务分组
     * 
     * 要求任务的派单状态为false，已经派单的任务分组不能删除，只能进行终止/取消；
     * 删除分组时不需要去判断或删除任务项，因为在未派单时不生成任务项记录；
     * 
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @DeleteMapping("/delete")
    public String deleteByParam(@RequestParam String id){
        return service.delete(id);
    }

    /**
     * 删除任务分组
     *
     * 要求任务的派单状态为false，已经派单的任务分组不能删除，只能进行终止/取消；
     * 删除分组时不需要去判断或删除任务项，因为在未派单时不生成任务项记录；
     *
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @DeleteMapping("/delete/{id}")
    public String deleteByPath(@PathVariable String id){
        return service.delete(id);
    }

    /**
     * 设置指定任务分组状态为完成
     * 
     * 要求任务分组的执行完成为false并且终止/取消为false；还需要判断该分组的任务项执行完成为true或终止/取消为true，即要求分组中的每个任务项都是完成或终止/取消状态；
     * 同时对任务的所有分组状态进行判断，如果任务的所有分组的执行完成为true或终止/取消为true设置任务的执行完成为true；
     * 
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @RequestMapping(value = "/finish",method = {RequestMethod.POST})
    public String finishByParam(@RequestParam String id){
        return service.finish(id);
    }

    /**
     * 设置指定任务分组状态为完成
     *
     * 要求任务分组的执行完成为false并且终止/取消为false；还需要判断该分组的任务项执行完成为true或终止/取消为true，即要求分组中的每个任务项都是完成或终止/取消状态；
     * 同时对任务的所有分组状态进行判断，如果任务的所有分组的执行完成为true或终止/取消为true设置任务的执行完成为true；
     *
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @RequestMapping(value = "/finish/{id}",method = {RequestMethod.POST})
    public String finishByPath(@PathVariable String id){
        return service.finish(id);
    }

    /**
     * 设置指定任务分组状态为终止
     * 
     * 要求任务分组的执行完成为false并且终止/取消为false；
     * 终止时需同时设置分组和分组下未完成未终止的任务项为终止状态；
     *
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @RequestMapping(value = "/end",method = {RequestMethod.POST})
    public String endByParam(@RequestParam String id){
        return service.end(id);
    }

    /**
     * 设置指定任务分组状态为终止
     *
     * 要求任务分组的执行完成为false并且终止/取消为false；
     * 终止时需同时设置分组和分组下未完成未终止的任务项为终止状态；
     *
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @RequestMapping(value = "/end/{id}",method = {RequestMethod.POST})
    public String endByPath(@PathVariable String id){
        return service.end(id);
    }

    /**
     * 设置指定任务分组状态为继续
     * 
     * 要求任务分组的终止/取消为true；
     * 继续时需同时设置分组和分组下已终止的任务项终止/取消为false；
     *
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @RequestMapping(value = "/continue",method = {RequestMethod.POST})
    public String continueByParam(@RequestParam String id){
        return service.setContinue(id);
    }

    /**
     * 设置指定任务分组状态为继续
     *
     * 要求任务分组的终止/取消为true；
     * 继续时需同时设置分组和分组下已终止的任务项终止/取消为false；
     *
     * @param id 任务分组ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/15
     */
    @RequestMapping(value = "/continue/{id}",method = {RequestMethod.POST})
    public String continueByPath(@PathVariable String id){
        return service.setContinue(id);
    }
}
